import axios, { type AxiosInstance, type AxiosRequestConfig, type AxiosResponse } from 'axios'
import type { ApiResponse } from '@/types/api'
import { messageService } from './messageService'
import { formatMessage } from '@/utils/messageHelper'

// API服务基础配置
// 开发环境使用代理，生产环境使用实际地址
const BASE_URL = import.meta.env.DEV ? '/api' : 'http://localhost:3000'

// 创建 axios 实例
const axiosInstance: AxiosInstance = axios.create({
  baseURL: BASE_URL,
  timeout: 10000, // 10秒超时
  headers: {
    'Content-Type': 'application/json',
  },
})

// 请求拦截器
axiosInstance.interceptors.request.use(
  (config) => {
    // 可以在这里添加认证 token 等
    // const token = localStorage.getItem('token')
    // if (token) {
    //   config.headers.Authorization = `Bearer ${token}`
    // }
    return config
  },
  (error) => {
    console.error('Request error:', error)
    return Promise.reject(error)
  },
)

// 响应拦截器
axiosInstance.interceptors.response.use(
  (response: AxiosResponse<ApiResponse>) => {
    const result = response.data

    // 响应拦截器：处理后端返回的标准格式
    if (result.success) {
      // 如果有消息且不为空，显示成功提示
      const formattedMessage = formatMessage(result.message)
      if (formattedMessage.trim()) {
        messageService.success(formattedMessage)
      }
      // 返回实际数据
      return result.data
    } else {
      // 请求失败，显示错误消息
      const formattedMessage = formatMessage(result.message)
      const errorMessage = formattedMessage || '请求失败，请稍后重试'
      messageService.error(errorMessage)

      // 创建一个带有特殊标记的错误，标识这是业务错误
      const businessError = new Error(errorMessage)
      ;(businessError as any).isBusinessError = true
      return Promise.reject(businessError)
    }
  },
  (error) => {
    console.error('API request failed:', error)
    const formattedMessage = formatMessage(error.response.data.message)
    const errorM = formattedMessage || '请求失败，请稍后重试'
    messageService.error(errorM)

    // 如果是业务错误，不显示额外的网络错误消息
    if (error.isBusinessError) {
      return Promise.reject(error)
    }

    // 处理不同类型的网络错误
    let errorMessage = '未知错误，请稍后重试'

    if (error.code === 'ECONNABORTED') {
      errorMessage = '请求超时，请检查网络连接'
    } else if (error.response) {
      // 服务器返回了错误状态码
      const status = error.response.status
      switch (status) {
        case 401:
          errorMessage = '未授权，请重新登录'
          break
        case 403:
          errorMessage = '没有权限访问该资源'
          break
        case 404:
          errorMessage = '请求的资源不存在'
          break
        case 500:
          errorMessage = '服务器内部错误'
          break
        default:
          errorMessage = `请求失败（${status}）`
      }
    } else if (error.request) {
      errorMessage = '网络请求失败，请检查网络连接'
    }

    messageService.error(errorMessage)
    return Promise.reject(error)
  },
)

// API服务对象
export const apiService = {
  // GET请求
  get<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return axiosInstance.get(url, config)
  },

  // POST请求
  post<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return axiosInstance.post(url, data, config)
  },

  // PUT请求
  put<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return axiosInstance.put(url, data, config)
  },

  // DELETE请求
  delete<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return axiosInstance.delete(url, config)
  },

  // PATCH请求
  patch<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return axiosInstance.patch(url, data, config)
  },
}

// 导出 axios 实例，供高级用法使用
export { axiosInstance }
